链表题目总结(第二篇)
第一篇里面的问题都是操作一个链表的情况,这一篇主要说说多个链表的一些问题
(1)合并两个已经排序好的链表
//l1, l2两个指针不断的后移 ListNode *MergeSortedLists(ListNode *l1, ListNode *l2) { ListNode newhead(0), *pos = &newhead; while(l1 || l2){ if(!l1) return (pos->next = l2, newhead.next); if(!l2) return (pos->next = l1, newhead.next); (l1->val < l2->val)? (pos = pos->next = l1, l1 = l1->next) : (pos = pos->next = l2, l2 = l2->next); } return newhead.next; }
(2)判断两个无环链表是否相交
// 判断两个链表是否相交,只需要判断两个链表最后一个节点是否为同一个即可 bool isMeetList(ListNode *pHead1, ListNode *pHead2){ if(!pHead1 || !pHead2) return false; ListNode *pos1 = pHead1, *pos2 = pHead2; while(pos1->next){ pos1 = pos1->next; } while(pos2->next){ pos2 = pos2->next; } return pos1 == pos2; }
(3)寻找两个无环链表第一个相交点
// 找到两个链表第一个相交点,首先遍历两个链表,得到两个链表的长度,比如说l1, l2 // 然后先移动较长的那个链表(比如l1>l2),移动l1-l2步,这样双方剩余的节点数就相等了 // 接着以前往后走,第一次相遇的点就是答案 ListNode *getFirstMeet(ListNode *pHead1, ListNode *pHead2){ if(!pHead1 || !pHead2) return NULL; ListNode *pos1 = pHead1, *pos2 = pHead2; int l1 = 0, l2 = 0; while(pos1->next){ l1++; pos1 = pos1->next; } while(pos2->next){ l2++; pos2 = pos2->next; } if(pos1 != pos2) return NULL; pos1 = l1 > l2? pHead1 : pHead2; pos2 = l1 > l2? pHead2 : pHead1; int count = l1 > l2? l1 - l2 : l2 -l1; while(count-- > 0){ pos1 = pos1->next; } while(pos1 && pos2){ if(pos1 == pos2) return pos1; pos1 = pos1->next; pos2 = pos2->next; } }
宁静淡泊,一任自然