解题技巧综合:
注意链表为空/链表中仅有一个节点的边界情况!!!!
不行的记得添加一个头节点 dummyHead !!!
快慢指针
找链表中间点
反转链表
再合并
206.反转链表
迭代:
func reverseList(head *ListNode) *ListNode {
p := head
var q *ListNode = nil
for p != nil {
next := p.Next
p.Next = q
q = p
p = next
}
return q
}
递归:
时间复杂度:O(n)
空间复杂度:O(n)
func reverseList(head *ListNode) *ListNode {
//1.迭代
//2.递归 1->2->3->nil
if head == nil || head.Next == nil {
return head
}
newhead := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return newhead
}
24两两交换链表中的节点
为啥是&&,不是||
for p1.Next != nil || p1.Next.Next != nil
当有偶数个节点时:1->2->3->4->nil
p1最后在4处,p1.Next=nil,故判断p1.Next.Next,但此时不存在p1.Next.Next
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
res := &ListNode{
Next:head}
p1 := res
for p1.Next != nil && p1.Next.Next != nil {
p2,p3 := p1.Next,p1.Next.Next
p1.Next = p3
p2.Next = p3.Next
p3.Next = p2
p1 = p1.Next.Next
}
return res.Next
}
148.排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
func sortList(head *ListNode) *ListNode {
//1.暴力:遍历找到最小值,放入新节点
//2.时间复杂度O(nlogn):归并、快排、堆排 注:二分查找=O(logn)
//1)