在go语言中实现对两个有序链表的相同元素删除算法示例

2023-06-01 00:00:00 示例 算法 有序

给出两条有序的链表,实现删除两条链表中共有的元素的算法,最终返回两个结果链表。

比如:

输入:

1->3->6->9
1->2->6->10

输出:

3->9
2->10


解决思路:

使用双指针(p1,p2)同时遍历两条链表,碰到相同大小的节点就同时移除,不相同的则移动较小值的指针。

这里注意一定要用空节点(pre节点)指向头节点,用于最终返回结果以及删除节点。


下面是我的实现代码,欢迎大家给出其他解法以及优雅的写法:

type Node struct {
    value int
    next *Node
}
func RemoveCommonItems(head1 Node, head2 Node) (Node, Node){
    p1, p2 := new(Node), new(Node)
    p1.next = &head1
    p2.next = &head2
    pre1 := p1
    pre2 := p2
    for p1.next != nil && p2.next != nil {
        if p1.next.value == p2.next.value {
            p1.next = p1.next.next
            p2.next = p2.next.next
        } else if p1.next.value > p2.next.value {
            p2 = p2.next
        } else {
            p1 = p1.next
        }
    }
    return *pre1.next, *pre2.next
}

代码测试:

package main
import "fmt"
//创建链表
func createLinkList(values []int) Node {
   pre := new(Node)
   p := pre
   for _, value := range values {
      p.next = new(Node)
      p.next.value = value
      p = p.next
   }
   return *pre.next
}
//打印链表
func printLinkList(head *Node) {
   for head != nil {
      fmt.Printf("%d -> ", head.value)
      head = head.next
   }
   fmt.Println("")
}
func main() {
   head1 := createLinkList([]int{1,3,6,9})
   head2 := createLinkList([]int{1,2,6,10})
   printLinkList(&head1)
   printLinkList(&head2)
   head1, head2 = RemoveCommonItems(head1, head2)
   printLinkList(&head1)
   printLinkList(&head2)
}

输出:

1 -> 3 -> 6 -> 9 -> 
1 -> 2 -> 6 -> 10 -> 
3 -> 9 -> 
2 -> 10 -> 

相关文章