160. 相交链表
1、试题介绍
编写一个程序,找到两个单链表相交的起始节点。
试题链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
2、java做法
2.1、双重循环
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA == null || headB == null) return null; while (headA != null) { ListNode p = headB; while (p != null) { if(headA == p) { return headA; } p = p.next; } headA = headA.next; } return null; }
测试结果:
2.2、双指针做法
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA == null || headB == null) return null; ListNode pA = headA; ListNode pB = headB; int sizeA = 0; int sizeB = 0; while (pA != null || pB != null) { if(pA != null) { sizeA++; pA = pA.next; } if(pB != null) { sizeB++; pB = pB.next; } } pA = headA; pB = headB; if(sizeA > sizeB) { for(int i = 0;i < sizeA - sizeB;i++) { pA = pA.next; } }else { for(int i = 0;i < sizeB - sizeA;i++) { pB = pB.next; } } while (pA != pB ) { if(pA == null || pB == null) return null; pA = pA.next; pB = pB.next; } return pA; }
测试结果:
3、C语言做法
3.1、双重循环
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { if(headA == NULL || headB == NULL) return NULL; while (headA != NULL) { struct ListNode* p = headB; while (p != NULL) { if(headA == p) { return headA; } p = p->next; } headA = headA->next; } return NULL; }
测试结果:
3.2、双指针做法
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { if(headA == NULL || headB == NULL) return NULL; struct ListNode* pA = headA; struct ListNode* pB = headB; int sizeA = 0; int sizeB = 0; while (pA != NULL || pB != NULL) { if(pA != NULL) { sizeA++; pA = pA->next; } if(pB != NULL) { sizeB++; pB = pB->next; } } pA = headA; pB = headB; if(sizeA > sizeB) { for(int i = 0;i < sizeA - sizeB;i++) { pA = pA->next; } }else { for(int i = 0;i < sizeB - sizeA;i++) { pB = pB->next; } } while (pA != pB ) { if(pA == NULL || pB == NULL) return NULL; pA = pA->next; pB = pB->next; } return pA; }
测试结果:
来源:https://www.cnblogs.com/xgp123/p/12397561.html