1.1. 题目
1.1.1. 合并K个排序链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
1.1.2. 题解:
- 旋转链表,把链表向右移动k个位置,此时可以理解链表头尾相连
- 不管移动多少,链表里的个数不会变,而且仔细看,类似把链表分了块,用其中一块做头,另外一块接在后面
1.1.3. 思路:
- 仔细观察,当k等于链表长度的时候,移动后的结果跟原链表是一样的!
- 当k==1时,链表整体往右移动一个,可以理解为把原末尾节点放到头节点,原倒数第二节点指向nil
- 比如
1->2->3->4->5->NULL, k = 2
可以理解为4->5
,1->2->3
,把5下一个节点指向1,原3节点的下一个节点指向nil - 仔细发现关系就是
链表长度 - ( k % 链表长度 )
处开始拆分链表,把后面的链表放到前面,前面的放到后面
1.1.4. 代码:
点击显示
func rotateRight(head *ListNode, k int) *ListNode {
if head == nil || head.Next == nil {
return head
}
lens,lastNode := listLen(head)
if lens == k {
return head
}
s := k % lens
if s == 0 {
return head
}
old := head
for i:=0;i<lens-s-1;i++ {
head = head.Next
}
newHead := head.Next
lastNode.Next = old
head.Next = nil
return newHead
}
func listLen(head *ListNode) (int,*ListNode) {
i := 1
for head.Next != nil {
i++
head = head.Next
}
return i,head
}