链表题目总结(第二篇)

时间:2021-01-18 09:17:21

第一篇里面的问题都是操作一个链表的情况,这一篇主要说说多个链表的一些问题

 

  (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;
    }   
}