160. Intersection of Two Linked Lists(Linked List-Easy)
2017-02-20 21:25
459 查看
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
Begin to intersect at node c1.
Notes:
● If the two linked lists have no intersection at all, return null.
● The linked lists must retain their original structure after the function returns.
● You may assume there are no cycles anywhere in the entire linked structure.
● Your code should preferably run in O(n) time and use only O(1) memory.
题目:写一个程序找出两个单链表的交叉节点。
思路:单链表A和单链表B,交叉点后的部分是一样的,也就是说长度是一样的,如上所示:c1 → c2 → c3。所以,将单链表A和单链表B相差的部分去掉,依次对应比较等长的部分即可。在计算两个链表的长度之后,比较两个链表的尾节点是否一样,如果不一样说明没有交叉节点,返回NULL。
Language : c
Language : cpp
Language:python
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
Begin to intersect at node c1.
Notes:
● If the two linked lists have no intersection at all, return null.
● The linked lists must retain their original structure after the function returns.
● You may assume there are no cycles anywhere in the entire linked structure.
● Your code should preferably run in O(n) time and use only O(1) memory.
题目:写一个程序找出两个单链表的交叉节点。
思路:单链表A和单链表B,交叉点后的部分是一样的,也就是说长度是一样的,如上所示:c1 → c2 → c3。所以,将单链表A和单链表B相差的部分去掉,依次对应比较等长的部分即可。在计算两个链表的长度之后,比较两个链表的尾节点是否一样,如果不一样说明没有交叉节点,返回NULL。
Language : c
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *curA = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode *curB = (struct ListNode*)malloc(sizeof(struct ListNode)); curA = headA; curB = headB; int length_a = 1; int length_b = 1; int i = 0; if(curA == NULL || curB == NULL){ return NULL; } while(curA->next != NULL){ curA = curA->next; length_a++; } while(curB->next != NULL){ curB = curB->next; length_b++; } if(curA != curB){ return NULL; } curA = headA; curB = headB; if(length_a > length_b){ for(i; i < length_a-length_b; i++){ curA = curA->next; } i = 0; } else if(length_a < length_b){ for(i; i < length_b-length_a; i++){ curB = curB->next; } i = 0; } while(curA != curB){ curA = curA->next; curB = curB->next; } return curA; }
Language : cpp
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *curA, *curB; curA = headA; curB = headB; if(curA == NULL || curB == NULL){ return NULL; } int length_a = getLength(curA); int length_b = getLength(curB); if(length_a > length_b){ for(int i=0; i < length_a-length_b; i++){ curA = curA->next; } } else if(length_a < length_b){ for(int i=0; i < length_b-length_a; i++){ curB = curB->next; } } while(curA != curB){ curA = curA->next; curB = curB->next; } return curA; } private: int getLength(ListNode *head){ int length = 1; while(head->next != NULL){ head = head->next; length++; } return length; } };
Language:python
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def getIntersectionNode(self, headA, headB): """ :type head1, head1: ListNode :rtype: ListNode """ if headA is None or headB is None: return None pa = headA # 2 pointers pb = headB while pa is not pb: # pa先遍历headA,然后再遍历headB # pb先遍历headB,然后再遍历headA pa = headB if pa is None else pa.next pb = headA if pb is None else pb.next return pa # 只有两种方式结束循环,一种是pa和pb所指相同,另一种是headA和headB都已经遍历完仍然没有找到。
相关文章推荐
- 21. Merge Two Sorted Lists(Linked List-Easy)
- LeetCode_Linked List_Merge Two Sorted Lists
- 160. Intersection of Two Linked Lists (Easy)
- 160. Intersection of Two Linked Lists(Linked List)
- [Linked List]Intersection of Two Linked Lists
- LeetCode 21 Merge Two Sorted Lists(合并两个已排序的链表)(Linked List)
- Remove Duplicates from Sorted List && Merge Two Sorted Lists && Linked List Cycle && Remove Nth Node
- LinkedList-21-Merge Two Sorted Lists
- 【LeetCode】160.Intersection of Two Linked Lists(Easy)解题报告
- leetcode_Intersection of Two Linked Lists_easy_主要是方法
- linked-list-cycle&&find-peak-element&&intersection-of-two-linked-lists
- 160.leetcode Intersection of Two Linked Lists(easy)[链表 公共节点]
- LeetCode[Linked List]: Intersection of Two Linked Lists
- 21. Merge Two Sorted Lists(Linked List)
- Intersection of Two Linked Lists(LIST-2 POINTER)
- [Leetcode 160, Easy] Intersection of Two Linked Lists
- [leetcode][list] Intersection of Two Linked Lists
- (**leetcode_LinkedList) Intersection of Two Linked Lists
- LeetCode-Easy部分中标签为LinkedList 160. Intersection of Two Linked Lists
- Insertion Sort List && Remove Duplicates from Sorted List II && Intersection of Two Linked Lists