跳到主要内容

链表

单链表 & 双链表


leetcode206_反转链表

题目

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解题思路分析

1、递归;时间复杂度O(n),空间复杂度O(n)

func reverseList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
res := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return res
}

2、迭代;时间复杂度O(n),空间复杂度O(1)

func reverseList(head *ListNode) *ListNode {
var prev *ListNode
curr := head
for curr != nil {
next := curr.Next
curr.Next = prev
prev = curr
curr = next
}
return prev
}

总结

递归和迭代都需要掌握


环形链表


leetcode21_合并两个有序链表

题目

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题思路分析

1、迭代遍历;时间复杂度O(n),空间复杂度O(1)

func mergeTwoLists(l1, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}

var head, node *ListNode
if l1.Val < l2.Val {
head = l1
node = l1
l1 = l1.Next
} else {
head = l2
node = l2
l2 = l2.Next
}

for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
node.Next = l1
l1 = l1.Next
} else {
node.Next = l2
l2 = l2.Next
}
node = node.Next
}

if l1 != nil {
node.Next = l1
}
if l2 != nil {
node.Next = l2
}
return head
}

2、递归实现;时间复杂度O(n),空间复杂度O(n)

func mergeTwoLists(l1, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}

if l1.Val < l2.Val {
l1.Next = mergeTwoLists(l1.Next, l2)
return l1
} else {
l2.Next = mergeTwoLists(l1, l2.Next)
return l2
}
}

总结

虽然迭代的算法最优,但是递归实现代码很简洁,可以记下来 面试的时候有一定几率会考察,考察的目的是考察面试者是否掌握基本的链表操作能力