LeetCode 160 Intersection of Two Linked Lists

LeetCode 160

Intersection of Two Linked Lists

  • Problem Description:
    找出两个单链表的公共节点

    具体的题目信息:
    https://leetcode.com/problems/intersection-of-two-linked-lists/description/

  • Solution:

    • 解题思路
      如果两个单链表有公共结点,那么在公共结点之后的结点必然重合,因为每个链表结点只有一个next域。故我们顺序遍历两个链表,寻找相同结点。由于两个链表长度不同,所以我们要先在长链表上遍历长链表比短链表多出来的k个结点,然后同步遍历寻找相同的结点。
    • 编程实现
      (1)getlen函数得到两个链表的长度
      (2)用diff变量记录长度差,长链表先遍历diff个结点,再同步遍历
/**
 * 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) {
        if (headA == NULL)
            return headA;
        if (headB == NULL)
            return headB;
        int lenA = getlen(headA);
        int lenB = getlen(headB);
        ListNode* longlist = headA;
        ListNode* shortlist = headB;
        int diff = lenA-lenB;
        if (lenA < lenB) {
            longlist = headB;
            shortlist = headA;
            diff = lenB-lenA;
        }
        while(diff--) {
            longlist = longlist->next;
        }
        while(longlist) {
            if (longlist == shortlist)
                return longlist;
            longlist = longlist->next;
            shortlist = shortlist->next;
        }
        return longlist;
    }
    int getlen(ListNode *t) {
        ListNode* temp = t;
        int len=0;
        while(temp) {
            temp = temp->next;
            len++;
        }
        return len;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值