链表公共节点之你的名字算法 2020-07-09(未经允许,禁止转载)

9_SooHyun · · 736 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

输入两个链表,找出它们的第一个公共节点

golang版

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

// 辣鸡程序员算法
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    // 压入两个栈,然后同时pop
    stack1, stack2 := []*ListNode{}, []*ListNode{}

    // 加入两个虚拟头节点,方便计算头节点就是共同节点的情况
    stack1 = append(stack1, &ListNode{0, headA}) 
    stack2 = append(stack2, &ListNode{0, headB}) 

    for headA != nil {
        stack1 = append(stack1, headA)
        headA = headA.Next
    }

    for headB != nil {
        stack2 = append(stack2, headB)
        headB = headB.Next
    }

    var ele1, ele2 *ListNode
    var flag = false
    for len(stack1) != 0 && len(stack2) != 0 {
        ele1, ele2 = stack1[len(stack1)-1], stack2[len(stack2)-1]
        if ele1 != ele2 {
            flag = true
            break
        }
        stack1 = stack1[:len(stack1)-1]
        stack2 = stack2[:len(stack2)-1]
    }
    if flag {
        return ele1.Next
    }
    
    return nil
}

// 《你的名字》算法
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    /* 你变成我,走过我走过的路。
    我变成你,走过你走过的路。
    然后我们便相遇了..
    */
    
    begin_a, begin_b := headA, headB
    // 只要未曾相遇
    for headA != headB {
        
        if headA != nil {
            headA = headA.Next
        }else{
            // 你变成我,走过我走过的路。
            headA = begin_b
        }

        if headB != nil {
            headB = headB.Next
        }else{
            // 我变成你,走过你走过的路。
            headB = begin_a
        }
    }
    // 然后我们便相遇了..
    return headA

}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

736 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传