更新代码:
开头检测是否需要调整(是否具有第三个节点)
使用三个ListNode* 变量记录奇偶链表的头尾headA,tailA为奇链表,headB为偶数链表,由于只需要最后令tailA->next=headB因此不需要tailB。
使用两个ListNode* 变量来进行遍历,cur记录当前链表节点指针,nxt记录下一个链表节点指针。
使用一个int 变量记录是否为奇数节点,如果是则更新tailA。
time O(n),space O(1)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** 定义四个变量:headA,headB记录第一个和第二个节点,tailA记录奇数节点的尾部,cur为当前遍历节点,next为下一个节点 **/ class Solution { public: ListNode* oddEvenList(ListNode* head) { if(head==NULL||head->next==NULL||head->next->next==NULL) return head; ListNode* headA=head,*headB=head->next; ListNode* tailA,*cur=head,*nxt=head->next; int flag=0; while(nxt){ cur->next=nxt->next; cur=nxt,nxt=nxt->next; if(flag) tailA=cur; flag=(flag+1)%2; } cur->next=NULL;// if(flag) cur->next=NULL;应该也可以 tailA->next=headB; return headA; } };
效果不错
C++代码:定义三个指针变量,cur,nex,head2,思路就是将链表分开为奇偶两部分,cur,和nex分别指向当前节点和下一个节点,当nex的下一个节点为NULL 终止循环,head指向第二个节点(如果有的话);
时间复杂度O(nodes);
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* oddEvenList(ListNode* head) { 12 if(head==NULL||head->next==NULL) return head; 13 ListNode* cur; 14 ListNode* nex; 15 ListNode* head2; 16 cur=head;nex=head->next;head2=nex; 17 int flag=1; 18 while(nex->next!=NULL){ 19 cur->next=nex->next; 20 cur=nex;nex=nex->next; 21 flag=-flag; 22 } 23 cur->next=NULL; 24 25 if(flag==1){ 26 cur->next=head2; 27 }else{ 28 nex->next=head2; 29 } 30 return head; 31 } 32 };
效果一般般: