如何找到单链表的中间节点
力扣P148
思路:借用两个快慢不同的指针,开始的时候让两个指针都指向链表第一个结点的位置,然后,让快指针一次走两步,让慢指针一次走一步。
- 链表结点个数为奇数个时:当快指针走到NULL前面一个结点的时候,慢指针此时刚好指向链表中间结点。
- 链表结点个数为偶数个时:当快指针走到NULL的时候,慢指针此时刚好指向链表中间结点。
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
//------主要代码实现如下-------
ListNode fNode = head;
ListNode sHead = head;
while (fNode.next != null && fNode.next.next != null) {
sHead = sHead.next;
fNode = fNode.next.next;
}
//--------------------------
ListNode midNode = sHead.next;
sHead.next = null;
ListNode leftHead = sortList(head);
ListNode rightHead = sortList(midNode);
//将两个链表慢慢合并,这个自己实现吧0v0
return merge(leftHead, rightHead);
}
额外再给一个简单题练习练习一下力扣P876
建议先做完再看答案
public ListNode middleNode(ListNode head) {
if(head==null){
return null;
}
ListNode fNode=head;
ListNode sNode=head;
while(fNode.next!=null && fNode.next.next!=null){
sNode=sNode.next;
fNode=fNode.next.next;
}
return fNode.next!=null?sNode.next:sNode;
}